#include "opencvwidget.h"


OpenCvWidget::OpenCvWidget(QWidget *parent) :
    QWidget(parent)
{
    //Configurando o widget
    m_layout = new QVBoxLayout;
    m_imageLabel = new QLabel;
    QImage dummy(600, 400, QImage::Format_RGB32);
    m_image = dummy;
    m_layout->addWidget(m_imageLabel);
    for (int x = 0; x < 600; x ++)
        for (int y =0; y < 400; y++)
            m_image.setPixel(x,y,qRgb(x, y, y));
    m_imageLabel->setPixmap(QPixmap::fromImage(m_image));
    setLayout(m_layout);

    //inicializando os controladores de tela
    showingVideo = false;

}


OpenCvWidget::~OpenCvWidget()
{
}

void OpenCvWidget::putFrame(cv::Mat imagem)
{
    m_imageLabel->setPixmap(QPixmap::fromImage(mat2QImage(imagem)));
}

void OpenCvWidget::clearFrame()
{
     m_imageLabel->setPixmap(QPixmap::fromImage(m_image));
}

bool OpenCvWidget::initCaptureFromCam()
{
    if(!showingVideo){
        camera.open(0); // abre a camera default
        if(!camera.isOpened()){  // verifica se ocorreu um erro
            qDebug () << "Nao foi possivel abrir a camera!!";
            return false;
        }else{
         videoTimerId = startTimer(120); // processa eventos a cada 120 ms = 30fps
         showingVideo = true;
         return true;
        }
    }else{
        killTimer(videoTimerId);
        showingVideo = false;
        camera.release();
        clearFrame();
        return false;
    }
}



void OpenCvWidget::timerEvent(QTimerEvent *)
{
    camera >> imagem;
    cv::TickMeter tm,tm2,tm3,tm4,tm5;
    try{
        if (!imagem.empty()) {
            tm.start();
            cv::Rect faceROI = tracker.detectFace(imagem);
            tm.stop();
            qDebug() << "Tempo de deteccao da Face: "<< tm.getTimeMilli();
            if(faceROI.height == 0 && faceROI.width == 0){
                qDebug() << "Nao foi encontrada nenhuma face";
            }else{
                //TENTAR COLOCAR EM TREADS SEPARADAS.........
                tm2.start();
                tracker.detectLeftEye(imagem(tracker.getLeftEyeRoiFromFaceArea(faceROI)));
                tm2.stop();
                qDebug() << "Tempo de deteccao do olho esquerdo: "<< tm2.getTimeMilli();
                tm3.start();
                tracker.detectRigthEye(imagem(tracker.getRightEyeRoiFromFaceArea(faceROI)));
                tm3.stop();
                qDebug() << "Tempo de deteccao do olho direito: "<< tm3.getTimeMilli();
                tm4.start();
                tracker.detectMouth(imagem(tracker.getMouthRoiFromFaceArea(faceROI)));
                tm4.stop();
                qDebug() << "Tempo de deteccao da Boca: "<< tm4.getTimeMilli();
                tm5.start();
                tracker.detectNose(imagem(tracker.getNoseRoiFromFaceArea(faceROI)));
                tm5.stop();
                qDebug() << "Tempo de deteccao do Nariz: "<< tm5.getTimeMilli();
            }
            this->putFrame(imagem);
        }

    }
    catch( cv::Exception& e )
    {
        const char* err_msg = e.what();
        std::cout << "exception caught: " << err_msg << std::endl;
    }
}

//void OpenCvWidget::timerEvent(QTimerEvent *)
//{
//    camera >> imagem;
//    try{
//        if (!imagem.empty()) {
//            cv::Rect faceROI = tracker.detectFace(imagem);
//            qDebug() << "Tempo de deteccao da Face: "<< tm.getTimeMilli();
//            if(faceROI.height == 0 && faceROI.width == 0){
//                qDebug() << "Nao foi encontrada nenhuma face";
//            }else{
//            }
//            this->putFrame(imagem);
//        }

//    }
//    catch( cv::Exception& e )
//    {
//        const char* err_msg = e.what();
//        std::cout << "exception caught: " << err_msg << std::endl;
//    }
//}





// Conversao entre QT e Opencv
cv::Mat OpenCvWidget::qImage2Mat(const QImage& qImg)
{
    cv::Mat mat = cv::Mat(qImg.height(), qImg.width(), CV_8UC4, (uchar*)qImg.bits(), qImg.bytesPerLine());
    cv::Mat mat2 = cv::Mat(mat.rows, mat.cols, CV_8UC3 );
    int from_to[] = { 0,0,  1,1,  2,2 };
    cv::mixChannels( &mat, 1, &mat2, 1, from_to, 3 );
    return mat2;
}

QImage OpenCvWidget::mat2QImage(const cv::Mat mat){

    QImage qImage(
                mat.data,
                mat.size().width,
                mat.size().height,
                mat.step,
                QImage::Format_RGB888
                );
    return qImage.rgbSwapped();
}





